package com.mitchellbosecke.benchmark;

import com.jfinal.kit.Kv;
import com.jfinal.template.Engine;
import com.jfinal.template.Template;
import com.mitchellbosecke.benchmark.model.Stock;
import freemarker.template.TemplateException;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Setup;
import java.io.IOException;
import java.util.Map;

/**
 * 测试 JFinal Enjoy 模板引擎
 * 
 * enjoy 对 byte 模式做过诸多优化，而本测试项目没有使用 byte 模式，
 * 否则 enjoy 的性能将领先更多 
 * 
 */
public class Enjoy extends BaseBenchmark {
    
    private Template template;
    private Map<?, ?> data;

    @Setup
    public void setup() throws IOException {
        // 配置快速模式，使用动态编译去除 java.lang.reflect.Method.invoke()，性能提升 13%
        Engine.setFastMode(true);
        
        // 配置从 class path 与 jar 包中读取模板文件
        Engine engine = Engine.use().setToClassPathSourceFactory();
        
        // 获取要被渲染的模板，Template 对象是线程安全的，可以多线程下并发使用
        template = engine.getTemplate("/templates/stocks.enjoy.html");
        
        // 获取渲染模板时用到的数据，类型为 JDK 的 Map 或其子类，本示例使用 Map 的子类 Kv
        data = Kv.by("items", Stock.dummyItems());
    }

    @Benchmark
    public String benchmark() throws TemplateException, IOException {
        return template.renderToString(data);
    }
}




